package com.itbaizhan.myshiro.domain;

import lombok.Data;

import java.io.Serializable;

//用户
//用于remember me   hiro会在浏览器Cookie中保存序列化后的认证数据。
//之后浏览器访问项目时会携带该Cookie数据，这样不登录也可以完成认证。
//而数据序列化要实现Serializable
@Data
public class Users implements Serializable {
    private Integer uid;
    private String username;
    private String password;
    private String salt;
}
/*Shiro认证_自定义Realm
*使用JdbcRealm认证时，数据库表名、字段名、认证逻辑都不能改变，我们可以自定义Realm进行更灵活的认证。
*
* 编写实体类

@Data
public class Users {
  private Integer uid;
  private String username;
  private String password;
}
编写mapper接口

public interface UsersMapper extends BaseMapper<Users> {
}
在启动类加载mapper接口

@SpringBootApplication
@MapperScan("com.itbaizhan.myshiro1.mapper")
public class Myshiro1Application {
  public static void main(String[] args) {
    SpringApplication.run(Myshiro1Application.class, args);
   }
}
编写自定义Realm类

public class MyRealm extends AuthorizingRealm {
  @Autowired
  private UserInfoMapper userInfoMapper;

  // 自定义认证方法
  @Override
  protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
    // 1.获取用户输入的用户名
    UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
    String username = token.getUsername();

    // 2.根据用户名查询用户
    QueryWrapper<Users> wrapper = new QueryWrapper<Users>().eq("username", username);
    Users users = usersMapper.selectOne(wrapper);

    // 3.将查询到的用户封装为认证信息
    if (users == null) {
      throw new UnknownAccountException("账户不存在");
     }

       参数1：用户
      参数2：密码
     参数3：Realm名

    return new SimpleAuthenticationInfo(users,
            users.getPassword(),
            "myRealm");
            }

// 自定义授权方法
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        return null;
        }
        }
        将自定义Realm放入SecurityManager对象中

@Configuration
public class ShiroConfig {
    // 自定义Realm
    @Bean
    public MyRealm myRealm(){
        return new MyRealm();
    }

    // SecurityManager对象
    @Bean
    public DefaultWebSecurityManager getDefaultWebSecurityManager(MyRealm myRealm){
        DefaultWebSecurityManager defaultSecurityManager=new DefaultWebSecurityManager();
        // 自定义Realm放入SecurityManager中
        defaultSecurityManager.setRealm(myRealm);
        return defaultSecurityManager;
    }
}
*
无需修改Service和Controller

        启动项目，访问登录页http://localhost/login，测试登录功能。*/